//package com.gofaraway.service.student.base;
//
//
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.Executors;
//
///**
// * @author ChenPeng
// * @Date 2024/8/19 19:53
// */
//public class Cache<K, V> {
//
//    @Resource
//    private RedisTemplate<String, V> redisTemplate;
//    @Resource
//    private RedissonClient redissonClient;
//    @Value("${expiration_time}")
//    private long expirationTime = 120L;
//    private final ExecutorService threadPool = Executors.newScheduledThreadPool(10);
//
//    @Resource
//    private AService aService;
//
//    public V get(K key) {
//        String keyStr = key.toString();
//        V value = redisTemplate.opsForValue().get(keyStr);
//        if (value != null) {
//            if (isExpired(keyStr)) {
//                update(key);
//            }
//            return value;
//        } else {
//            return update(key);
//        }
//    }
//
//    public V update(K key) {
//        CompletableFuture<V> vCompletableFuture = CompletableFuture.supplyAsync(() -> {
//            RLock lock = redissonClient.getLock(key.toString());
//            try {
//                // 尝试获取分布式锁
//                boolean isLocked = lock.tryLock(10, 10, TimeUnit.SECONDS);
//                if (isLocked) {
//                    try {
//
//                        //获取到锁 再次检查缓存是否被并发更新
//                        V value = redisTemplate.opsForValue().get(key);
//                        if (value != null && !isExpired(key.toString())) {
//                            return value;
//                        }
//
//                        //设置新的值和过期时间
//                        V newValue = aService.get(key);
//                        redisTemplate.opsForValue().set(key.toString(), newValue, expirationTime, TimeUnit.SECONDS);
//                        return newValue;
//                    } finally {
//                        lock.unlock();
//                    }
//                }
//            } catch (InterruptedException e) {
//                Thread.currentThread().interrupt();
//            }
//            return null;
//        }, threadPool);
//
//        V v = vCompletableFuture.join();
//        threadPool.shutdown();
//        return v;
//    }
//
//    private boolean isExpired(String keyStr) {
//        Long ttl = redisTemplate.getExpire(keyStr, TimeUnit.SECONDS);
//        return ttl == null || ttl <= 0;
//    }
//
//    /**
//     * AService伪接口
//     */
//    @Service
//    public class AService {
//        public <K, V> V get(K key) {
//            // 实现获取实时数据的逻辑
//            return null;
//        }
//    }
//}
//
//
